Skip to content

Conversation

@JatinSanghvi
Copy link
Contributor

@JatinSanghvi JatinSanghvi commented Sep 15, 2022

Performed well-rounded manual testing (three apps with random long processing time for each batch) to ensure there is no impact.

{
this._logger.LogDebugWithThreadId("BEGIN WaitRowsLock - LeaseRenewal");
await this._rowsLock.WaitAsync(token);
this._logger.LogDebugWithThreadId("END WaitRowsLock - LeaseRenewal");
Copy link
Contributor Author

@JatinSanghvi JatinSanghvi Sep 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Waiting on semaphore inside RenewLeasesAsync instead, so that we have same method both waiting on and releasing the semaphore.

await this._rowsLock.WaitAsync(token);
this._logger.LogDebugWithThreadId("END WaitRowsLock - RenewLeases");

if (this._state == State.ProcessingChanges)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have single a if statement instead of repetitive checks in try and finally blocks.

// Don't want to change the "_rows" while another thread is attempting to renew leases on them.
await this._rowsLock.WaitAsync(token);
this._logger.LogDebugWithThreadId("END WaitRowsLock - ReleaseLeases");
long newLastSyncVersion = this.RecomputeLastSyncVersion();
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to wait for semaphore here. While the _state is set to ProcessingChanges, the semaphore should be acquired if and only if either of _rows, _state or _leaseRenewalLoop needs to be modified in change-consumption loop and none of the shared class fields are getting modified. Once the _state equals ProcessingChanges, it is only ClearRowsAsync method that is in charge of modifying the rows, hence it is the only method that should be waiting on semaphore.

@JatinSanghvi JatinSanghvi merged commit 1dad068 into triggerbindings Sep 16, 2022
@JatinSanghvi JatinSanghvi deleted the JatinSanghvi/simplify-locking branch September 16, 2022 01:35
@JatinSanghvi JatinSanghvi linked an issue Sep 16, 2022 that may be closed by this pull request
Charles-Gagnon added a commit that referenced this pull request Sep 23, 2022
* Don't publish TSA results on PRs (#327)

* Don't publish TSA results on PRs

* fix

* Add more debug logging (#328)

* add debug logging

* pr comments + fix test

* log queries

* Add benchmark project for performance tests (#294)

* add benchmark project

* fix logger

* fix logger

* copy functions to benchmark output folder

* cleanup

* move setup methods to base

* add output binding perf

* clean up

* add README

* fix readme

* add link to integration tests

* typo

* cleanup + comments

* address pr comments

* fix readme

* fix integration test base

* pr comments

* Fix localization/serialization issues (#329)

* Fix localization issues

* split tests & cleanup

* Replace file copy with itemgroup

* Add policheck and var for uploading to TSA (#332)

* Add policheck

* Upload policheck to TSA codebase

* Try globbing files

* Scan all

* Only upload when var set

* post analysis

* Only on windows

* break on warn

* testing

* re-enable and break on error

* Update notification alias

* Fix local build errors (#334)

* Fix local build errors

* Update comments

* Fix log error not printing out primary key name (#335)

* Don't run Roslyn analyzers on PRs (#336)

* Don't run Roslyn analyzers on PRs

* fix

* Do not process rows if lease acquisition fails (#339)

* Fix README link (#342)

* Escape special characters in Readme file (#346)

* Wait for error inside `StartFunctionsHostAndWaitForError` method (#349)

* Add test for multiple triggered functions (#343)

* Add retry when attempting to release leases (#340)

* Add retry when attempting to release leases

* Address comments

* Address more comments

* Change loop structure according to comment

* sql version telemetry data from input bindings (#337)

* connection info telemetry data frm input bindings

* capture convert event after collecting connection

* remove event

* first collect telemetry

* fix tests

* make convert type optional

* update xml

* add telemetry service

* clean up

* remove ITelemetryService

* undo changes

* merge conflict

* missed merge conflict

* extra line

* add null check

* capture telemetry after opening connection

* correct connection

* move telemtery after connection.OpenAsync

* open connection on initialize

* add xml

* address comments

* refactor test

* add xml comment

* update xml

* add check back

* add connection state check

* remove explicit checks

* add isDisposed

* add comments

* revert isDisposed changes

* add comment with github issue link

* Refactor locking logic in class `SqlTableChangeMonitor` (#357)

* cherry-pick c5a746f

* Merge commit '76575f29e964f3487684b84e279444279296f5c2' into chgagnon/mergeFromMain1

# Conflicts:
#	src/SqlAsyncCollector.cs
#	test/GlobalSuppressions.cs

* Add comments to explain LastSyncVersion selection (#358)

* Fix

* Move test scripts

* Constructor cleanup (#362)

* Initialize vars at declaration

* Remove extra ;

* More cleanup

* Remove configuration

* Add configuration for batch size/polling interval (#364)

* Add configuration for batch size/polling interval

* PR comments

Co-authored-by: Lucy Zhang <luczhan@microsoft.com>
Co-authored-by: Jatin Sanghvi <20547963+JatinSanghvi@users.noreply.github.com>
Co-authored-by: AmeyaRele <35621237+AmeyaRele@users.noreply.github.com>
Co-authored-by: Maddy <12754347+MaddyDev@users.noreply.github.com>
chlafreniere pushed a commit that referenced this pull request Sep 20, 2024
* Don't publish TSA results on PRs (#327)

* Don't publish TSA results on PRs

* fix

* Add more debug logging (#328)

* add debug logging

* pr comments + fix test

* log queries

* Add benchmark project for performance tests (#294)

* add benchmark project

* fix logger

* fix logger

* copy functions to benchmark output folder

* cleanup

* move setup methods to base

* add output binding perf

* clean up

* add README

* fix readme

* add link to integration tests

* typo

* cleanup + comments

* address pr comments

* fix readme

* fix integration test base

* pr comments

* Fix localization/serialization issues (#329)

* Fix localization issues

* split tests & cleanup

* Replace file copy with itemgroup

* Add policheck and var for uploading to TSA (#332)

* Add policheck

* Upload policheck to TSA codebase

* Try globbing files

* Scan all

* Only upload when var set

* post analysis

* Only on windows

* break on warn

* testing

* re-enable and break on error

* Update notification alias

* Fix local build errors (#334)

* Fix local build errors

* Update comments

* Fix log error not printing out primary key name (#335)

* Don't run Roslyn analyzers on PRs (#336)

* Don't run Roslyn analyzers on PRs

* fix

* Do not process rows if lease acquisition fails (#339)

* Fix README link (#342)

* Escape special characters in Readme file (#346)

* Wait for error inside `StartFunctionsHostAndWaitForError` method (#349)

* Add test for multiple triggered functions (#343)

* Add retry when attempting to release leases (#340)

* Add retry when attempting to release leases

* Address comments

* Address more comments

* Change loop structure according to comment

* sql version telemetry data from input bindings (#337)

* connection info telemetry data frm input bindings

* capture convert event after collecting connection

* remove event

* first collect telemetry

* fix tests

* make convert type optional

* update xml

* add telemetry service

* clean up

* remove ITelemetryService

* undo changes

* merge conflict

* missed merge conflict

* extra line

* add null check

* capture telemetry after opening connection

* correct connection

* move telemtery after connection.OpenAsync

* open connection on initialize

* add xml

* address comments

* refactor test

* add xml comment

* update xml

* add check back

* add connection state check

* remove explicit checks

* add isDisposed

* add comments

* revert isDisposed changes

* add comment with github issue link

* Refactor locking logic in class `SqlTableChangeMonitor` (#357)

* cherry-pick 6f23a5a

* Merge commit 'd594efe88f0f7d32e4dcd31faad22885291d4902' into chgagnon/mergeFromMain1

# Conflicts:
#	src/SqlAsyncCollector.cs
#	test/GlobalSuppressions.cs

* Add comments to explain LastSyncVersion selection (#358)

* Fix

* Move test scripts

* Constructor cleanup (#362)

* Initialize vars at declaration

* Remove extra ;

* More cleanup

* Remove configuration

* Add configuration for batch size/polling interval (#364)

* Add configuration for batch size/polling interval

* PR comments

Co-authored-by: Lucy Zhang <luczhan@microsoft.com>
Co-authored-by: Jatin Sanghvi <20547963+JatinSanghvi@users.noreply.github.com>
Co-authored-by: AmeyaRele <35621237+AmeyaRele@users.noreply.github.com>
Co-authored-by: Maddy <12754347+MaddyDev@users.noreply.github.com>
PBBlox pushed a commit to PBBlox/azure-functions-sql-extension that referenced this pull request Apr 6, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Simplify locking logic in class SqlTableChangeMonitor

3 participants